iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
佛心分享-SideProject30

RISC-V CPU 設計與實作系列 第 5

[Day 05] Blocking & Nonblocking

  • 分享至 

  • xImage
  •  

大家可會好奇,同樣是賦值,為什麼會有 <=, = 的區別呢?這就要提到 blockingnonblocking 的概念。

先給一個 Pseudocode,再來分析兩者的差別:

// 初始化變數
a <- 5
b <- 6
c <- 7

// 主程式
b <- a
c <- b
a <- c

為了不混淆,我們以 <- 代表賦值

Blocking

// 初始化變數
initial begin
    a = 5;
    b = 6;
    c = 7;
end

// 主程式:blocking assignment (=)
always *(posedge clk) begin
    b = a;
    c = b;
    a = c;
end

Blocking 表示的過程就和 C 語言的運行方式一樣,也就是說執行完 b = a 之後,才會執行 c = b, a = c 。因此當電路運行後,a, b, c 皆為 5 。Blocking 的含義就是當執行 b = a 時,下方的電路不會被執行,就像被擋住 (block) 一般。

Nonblocking

// 初始化變數
initial begin
    a <= 5;
    b <= 6;
    c <= 7;
end

// 主程式:nonblocking assignment (<=)
always *(posedge clk) begin
    b <= a;
    c <= b;
    a <= c;
end

Nonblocking 加入了平行運算的概念,也就是說 b <= a, c <= b, a <= c 是同時運作的。也可以用另一個觀點來看,我們先確認所有 <= 右邊的運算結果,再一次賦值給 <= 左邊。因此最終的結果 a 是 7 ,b 是 6 ,c 是 5 。

小結論

Blocking 和 nonblocking 並非每次都要考慮,像是上述的「初始化變數」,變數之間沒有相依性問題,就不需要考慮。Blocking 大致上可以視為用在組合電路的賦值,而 nonblocking 可以視為用在循序電路的賦值。以此區別就可以減少很多錯誤了,當然特殊情況不在此限!


上一篇
[Day 04] Verilog 與 循序電路
下一篇
[Day 06] Simulation with Icarus Verilog
系列文
RISC-V CPU 設計與實作6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言